package com.ruoyi.web.controller.admin.msg;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.system.dto.*;
import com.ruoyi.system.dto.UnifiedPushDTO;
import com.ruoyi.system.service.MsgPushService;
import com.ruoyi.system.vo.MsgPushTaskWithDetailsVO;
import com.ruoyi.system.vo.MsgPushTaskDetailVO;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.validation.Valid;

/**
 * 消息推送管理控制器
 * 提供消息推送任务的创建、管理、查询等功能
 * 支持统一推送、草稿保存、任务重推等操作
 */
@RestController
@RequestMapping("/admin/msg/push")
public class MsgPushController extends BaseController {

    /**
     * 消息推送服务
     */
    @Resource
    private MsgPushService pushService;

    /**
     * 保存推送任务草稿
     * 用于保存未完成的推送任务，支持后续编辑和发送
     */
    @PostMapping("/save-draft")
    public AjaxResult draft(@Valid @RequestBody UnifiedPushDTO pushDTO) {
        return AjaxResult.success(pushService.saveDraft(pushDTO));
    }

    /**
     * 统一推送接口
     * 根据模板类型自动识别并推送对应类型的消息
     * 支持合同签署、施工验收、主材清单等多种消息类型
     */
    @PostMapping("/unified-push")
    public AjaxResult unifiedPush(@Valid @RequestBody UnifiedPushDTO pushDTO) {
        return AjaxResult.success(pushService.unifiedPush(pushDTO));
    }

    /**
     * 分页查询推送任务（包含接收明细）
     * 用于后台管理，支持多条件查询和分页展示，同时包含接收者明细和统计信息
     */
    @GetMapping("/page")
    public AjaxResult page(@Valid MsgPushTaskQueryDTO queryDTO) {
        IPage<MsgPushTaskWithDetailsVO> p = pushService.pageTasksWithDetails(queryDTO);
        return AjaxResult.success(p);
    }

    /**
     * 获取任务详情
     * 返回任务的完整信息，包括接收者状态和统计信息，不包含日志
     */
    @GetMapping("/{taskId}")
    public AjaxResult detail(@PathVariable Long taskId) {
        MsgPushTaskDetailVO detail = pushService.getTaskDetail(taskId);
        return AjaxResult.success(detail);
    }

    /**
     * 立即推送消息
     * 接收消息ID，校验状态，修改状态为已推送
     */
    @PostMapping("/send-now/{taskId}")
    public AjaxResult sendNow(@PathVariable Long taskId) {
        String operator = getUsername();
        boolean result = pushService.sendNow(taskId, operator);
        return AjaxResult.success("推送成功", result);
    }

    /**
     * 重推消息
     * 接收原消息ID，复制一条新消息并直接推送
     */
    @PostMapping("/resend/{originalTaskId}")
    public AjaxResult resendMessage(@PathVariable Long originalTaskId) {
        String operator = getUsername();
        Long newTaskId = pushService.resendMessage(originalTaskId, operator);
        return AjaxResult.success("重推成功", newTaskId);
    }

    /**
     * 取消消息
     */
    @PostMapping("/cancel/{taskId}")
    public AjaxResult cancelMessage(@PathVariable Long taskId) {
        String operator = getUsername();
        boolean result = pushService.cancelTask(taskId, operator);
        return AjaxResult.success("取消成功", result);
    }

}
